# === Series数学运算 ===
import pandas as pd
import numpy as np

print("=== Series数学运算 ===")
s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
s2 = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
s3 = pd.Series([100, 200], index=['a', 'b'])  # 不同长度

print("s1:")
print(s1)
print("\ns2:")
print(s2)

# 基本数学运算（自动对齐索引）,如果索引没有对应的，则值变为none
print("\n加法 s1 + s2:")
print(s1 + s2)

print("\n乘法 s1 * s2:")
print(s1 * s2)

print("\n幂运算 s1 ** 2:")
print(s1 ** 2)

# 不同长度Series运算（自动对齐，缺失填充NaN）
print("\n不同长度Series运算 s1 + s3:")
print(s1 + s3)

# 使用fill_value处理缺失值，如果没有对应的索引，则数值加上fill_value=1
print("\n使用fill_value的加法:")
print(s1.add(s3, fill_value=0))

# 与标量运算
print("\n与标量运算 s1 + 10:")
print(s1 + 10)

# 数学函数
print("\n数学函数应用:")
print("平方根 np.sqrt(s1):")
print(np.sqrt(s1))

# 就是自然对数作为底数，求log
print("\n对数 np.log(s1):")
print(np.log(s1))

# 应用自定义函数
def custom_func(x):
    return x * 2 + 1

print("\n应用自定义函数 s1.apply(custom_func):")
print(s1.apply(custom_func))